<!DOCTYPE html>
<html lang="zh-CN">

<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <link type="text/css" rel="stylesheet" href="styles.css">
  <script type="text/javascript" src="config.js"></script>
</head>

<body>
  <h1 class="h">5. 通用函数技巧</h1>
  <dl>
    <dt>1. 指定输出位置（out参数）</dt>
    <dd>
      可以将计算结果直接写入到一个已存在的数组中，节省内存。
      <pre><code>a = np.arange(5)
b = np.empty(5)

np.multiply(a, 10, out=b) # 将 a*10 的结果直接写入b，而不创建临时数组
print(b) # [ 0. 10. 20. 30. 40.]

# 甚至可以写入到数组的视图（如每隔一个元素）
np.power(a, 2, out=b[::2]) # 将 a^2 的结果写入b的偶数索引位置
print(b) # [ 0. 10. 1. 30. 4.]</code></pre>
    </dd>
    <dt>2. 聚合（Reduce）</dt>
    <dd>
      沿指定轴连续执行操作，相当于“累计算”。
      <pre><code>a = np.arange(1, 6) # [1, 2, 3, 4, 5]
np.add.reduce(a) # ((((1+2)+3)+4)+5) = 15
np.multiply.reduce(a) # ((((1*2)*3)*4)*5) = 120 (阶乘)

# 对多维数组指定轴
b = np.arange(12).reshape(3, 4)
np.add.reduce(b, axis=0) # 对每一列进行求和（沿行方向reduce）</code></pre>
    </dd>
    <dt>3. 累积（Accumulate）</dt>
    <dd>
      返回中间结果，类似于 itertools.accumulate。
      <pre><code>a = np.arange(1, 6)
np.add.accumulate(a) # [1, 3, 6, 10, 15] (累加和)
np.multiply.accumulate(a) # [1, 2, 6, 24, 120] (累乘积)</code></pre>
    </dd>
  </dl>
</body>

</html>